/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Repositorio;

import ClassesBasicas.Funcao;
import Conexao.GConexao;
import Conexao.IConexao;
import erro.ConexaoException;
import erro.RepositorioException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Collection;

/**
 * Camada de acesso aos dados da classe Estadio no modelo DAO 
 * @author leyla
 */
public class RepFuncao implements IRepFuncao{
    
    //Representa o GConexão
    private IConexao conexao;
    
    //Quando o objeto RepFuncao for instanciado, instanciará o GConexao também
    
    public RepFuncao() {
        conexao = GConexao.getInstancia();
    }
    
    /**
     * 
     * @param f
     * @throws ConexaoException
     * @throws RepositorioException 
     */
    
    @Override
    public void salvar(Funcao f) throws ConexaoException, RepositorioException {
        Connection c = conexao.conectar();
        
        String sqlSalvarFuncao = "INSER INTO funcao(nome_funcao) values(?)";
        try{
            PreparedStatement pstm = c.prepareStatement(sqlSalvarFuncao);
            pstm.setString(1,f.getNomeFuncao());
            pstm.executeUpdate();
            pstm.close();
        }
        catch(SQLException e){
            throw new RepositorioException(e.getMessage());
        }
            finally{
                conexao.desconectar(c);
            }
    }
    
    /**
     * Consultar uma Função pelo código
     * 
     * @param codFuncao
     * @return
     * @throws ConexaoException
     * @throws RepositorioException 
     */
    
    @Override
    public Funcao consultar(int codFuncao) throws ConexaoException,RepositorioException {
        Funcao f = null;
        
        Connection c = conexao.conectar();
		
	String sqlConsultFuncaoById = "SELECT cod_Funcao,nome_Funcao FROM Funcao WHERE(cod_Funcao = ?) ";
		
		try {
			PreparedStatement pstm = c.prepareStatement(sqlConsultFuncaoById);
			pstm.setInt(1,codFuncao);
			ResultSet result = pstm.executeQuery();
			
			if(result.next()){
				f = new Funcao();
				f.setCodFuncao(result.getInt("cod_Funcao"));
				f.setNomeFuncao(result.getString("nome_Funcao"));
			}
			
		} catch (SQLException e) {
			throw new RepositorioException(e.getMessage());
		}
		finally{
			conexao.desconectar(c);
		}
		
		return f;
	}
        
        /**
         * Consulta uma função pela descrição
         * 
         * @param descricao
         * @return
         * @throws ConexaoException
         * @throws RepositorioException 
         */
        
    @Override
    public Funcao consultar(String descricao) throws ConexaoException,RepositorioException {
        Funcao f = null;
        
        Connection c = conexao.conectar();
        
        String sqlConsultFuncaoById = "SELECT cod_Funcao,nome_Funcao FROM Funcao WHERE(nome_Funcao = ?) ";
        
        try {
            PreparedStatement pstm = c.prepareStatement(sqlConsultFuncaoById);
            pstm.setString(1,descricao);
            ResultSet result = pstm.executeQuery();
            
            if(result.next()){
                f = new Funcao();
                f.setCodFuncao(result.getInt("cod_Funcao"));
                f.setNomeFuncao(result.getString("nome_Funcao"));
            }
            
            } catch (SQLException e) {
                throw new RepositorioException(e.getMessage());
            }
            finally{
                conexao.desconectar(c);
            }
        
            return f;
	}
        
        /**
         * Excluir função pelo código
         * 
         * @param codFuncao
         * @throws ConexaoException
         * @throws RepositorioException 
         */
       
    @Override
    public void excluir(int codFuncao) throws ConexaoException,RepositorioException  {
		
        Connection c = conexao.conectar();
		
	String sqlExcluirFuncao = "DELETE FROM Funcao WHERE(cod_Funcao = ?)";
		
	try {
		PreparedStatement pstm = c.prepareStatement(sqlExcluirFuncao);
		pstm.setInt(1, codFuncao);
		pstm.executeUpdate();
		pstm.close();
	} catch (SQLException e) {
		throw new RepositorioException(e.getMessage());
	}
	finally{
            conexao.desconectar(c);
	}
    }
    
    /**
     * Excluir uma Função pela Descrição
     * 
     * @param descricao
     * @throws ConexaoException
     * @throws RepositorioException 
     */
        
    @Override
    public void excluir(String descricao) throws ConexaoException,RepositorioException{
            
    Connection c = conexao.conectar();
            
    String sqlExcluirFuncao = "DELETE FROM Funcao WHERE(nome_Funcao = ?)";
            
    try {
        PreparedStatement pstm = c.prepareStatement(sqlExcluirFuncao);
        pstm.setString(1, descricao);
        pstm.executeUpdate();
        pstm.close();
    } catch (SQLException e) {
        throw new RepositorioException(e.getMessage());
    }
    finally{
        conexao.desconectar(c);
    }
}
        
        
	public Collection<Funcao> listar() throws ConexaoException,RepositorioException {
		Funcao f = null; 
		ArrayList<Funcao> lista = new ArrayList<Funcao>();
		
		Connection c = conexao.conectar();
		
		String sqlListaFuncao = "SELECT cod_Funcao, nome_Funcao FROM Funcao";
		
		try {
			PreparedStatement pstm = c.prepareStatement(sqlListaFuncao);
			ResultSet result = pstm.executeQuery();
			
			while(result.next()){
				f = new Funcao();
				f.setCodFuncao(result.getInt(1));
				f.setNomeFuncao(result.getString(2));
				lista.add(f);
			}
		} catch (SQLException e) {
			throw new RepositorioException(e.getMessage());
		}
		finally{
			conexao.desconectar(c);
		}
		return lista;
	}

    @Override
    public void alterar(Funcao f) throws ConexaoException, RepositorioException {
        throw new UnsupportedOperationException("Not supported yet.");
    }
}
